package animal;

/*
    final class:表示该类没有子类,即该类不能被继承
    final 方法:表示该方法不能被子类重写,但是不影响该方法被调用
    final 局部变量:只要在具体被使用之前进行赋值即可,一旦赋值不允许被修改
    final 类中的成员属性:赋值过程:1.定义的时候直接初始化2.在构造方法中进行初始化3.在构造代码块中进行初始化
    final 引用类型(对象):初始化之后不能再指向另一个对象,但对象的内容是可以改变的
    static final:配合static使用来表示全局的不允许被修订的内容
 */
public  class Animal {
    /*
    private:只允许在本类中进行访问
    public:允许在任意位置访问
    public int temp=15;
    protected:允许在当前类/同包子类调用/跨包子类调用/同包非子类调用
              不允许跨包非子类调用
    默认:允许在当前类调用/同包子类调用/同包非子类调用
         不允许跨包子类调用
     */
    private String name;//昵称
    private int month;//月份
    private String species;//品种

    //静态成员在类加载的时候会被优先加载
    /*
    类在加载的时候会优先加载父类的静态成员然后加载子类的静态成员
    使用super()调用父类指定构造方法,必须在子类的构造方法的第一行
     */
//    private static int st1=22;
//    public static int st2=444;
//    static {
//        System.out.println("我是父类的静态代码块");
//    }
//    {
//        System.out.println("我是父类的构造代码块");
//    }

    public Animal(){
//        System.out.println("我是父类的无参构造方法");
    }
    //多参构造
    public Animal(String name,int month){
        this.setName(name);
        this.setMonth(month);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public String getSpecies() {
        return species;
    }

    public void setSpecies(String species) {
        this.species = species;
    }

    //吃东西方法
    public String eat(){
        final int temp=15;//局部变量
        String str=this.getName()+"在吃东西!";
        return str;
    }

    //自定义判断两个对象中的内容是否相同
    public boolean equals(Object obj){
        if (obj==null){
            return false;
        }
        Animal temp=(Animal)obj;
        if (this.getName().equals(temp.getName())&&(this.getMonth()==temp.getMonth())){
            return true;
        }else {
            return false;
        }
    }
    //多态:意味着允许不同类的对象对同一消息做出不同的响应
    /*
    编译时多态:又称设计时多态一般通过方法重载来实现
    运行时多态:程序运行时决定调用哪个方法(大多数是运行时多态)
     */

}
